#!/bin/bash
#
# Copy to usb - Copia os arquivos selecionados para um dispositivo usb.
#
# Copyright (C) 2008 Flávio Amieiro <amieiro.flavio@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 dated June, 1991.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
# If you find any bugs or have any suggestions email: amieiro.flavio@gmail.com
#
#
#
# Histórico de versões:
#
# Versão 0.1 - Aparentemente funcional. Ainda não tenho muita certeza da
#              precisão do método de determinação do diretório de destino. 
#              Ainda bastante baseado em POG.
#
# Versão 0.2 - Modificado o método de determinação do diretório de destino.
#              Agora o script procura por /dev/sd** (na versão anterior estava
#              preso ao sdb*, então pontos pela generalização) que tenha seu
#              ponto de montagem em /media (padrão pelo menos no Ubuntu e no
#              Fedora). Ainda não me convenceu.
#              Confere se o diretório de destino existe. Se não, mostra um erro.
#
# Versão 0.3 - Adicionado suporte a diretórios.
#
# Versão 0.4 - Caso o dispositivo não seja encontrado automaticamente, dá ao
#              usuário a opção de indicar o caminho dele.
#
# Versão 0.5 - Verifica se algum arquivo foi selecionado. Caso contrário, exibe
#              um aviso e termina com status 1.
#              Corrigido nome do diretório padrão no diálogo de seleção de
#              arquivos (estava como "/media", passou a ser "/media/", o correto)
#
# Versão 0.6 - Se mais de um ponto de montagem for detectado automaticamente, 
#              mostra uma lista para o usuário escolher. Isso ainda não funciona
#              para casos em que o nome do ponto de montagem tenha espaços.
#              mas isso não deve atrapalhar para pen-drives montados automatica-
#              mente.
#              Adiciona um diálogo final, mostrando quantos arquivos foram
#              copiados, e para qual diretório.
#
# Versão 0.7 - Adicionada uma barra de progresso. Ainda não funciona muito bem,
#              por que só anda no final de cada operação (i.e. no final da cópia
#              de cada arquivo ou diretório). A documentação do zenity é ridícula.
#
#
# Versão 0.8 - Adicionada a possibilidade de determinar o caminho do ponto de
#              montagem do dispositivo direto em um arquivo de configuração
#              (~/.copytousbrc). Deve haver apenas um ponto de montagem 
#              especificado, em uma linha. O arquivo aceita comentários
#              delimitados pelo caractere #.
#
#

# Arquivo de configuração:
CONFIGFILE="$HOME/.copytousbrc"

# Verificando se algum arquivo foi selecionado:
if [ "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" = "" ]
then
    zenity --info --text="Nenhum arquivo selecionado"
    exit 1
fi


if test -f "$CONFIGFILE"
then
    # Tratando o arquivo de configuração:
    #       o arquivo       |   comentários  |      espaços      | linhas vazias
    DIR=$(cat "$CONFIGFILE" | sed 's/#.*//g' | sed 's/^[^/]*//g' | sed '/^$/d')
else
    # Encontrando automaticamente o diretório para o qual serão enviados os 
    # arquivos. Essa solução ainda não me convence.
    DIR_TRY=$(cat /etc/mtab | grep '/dev/sd..' | grep /media | cut -d' ' -f2)

    COUNT_DIR=$(echo "$DIR_TRY" | wc -l)

    if [ $COUNT_DIR -gt 1 ]
    then
        DIR=$(zenity --list --text "Mais de um ponto de montagem possível foi encontrado.\ 
    Escolha um deles." --column "Ponto de montagem:" $DIR_TRY)
    else
        DIR="$DIR_TRY"
    fi
fi
#DIR=$(echo "Não existe") #só pra não copiar

# Arquivo temporário onde são armazenados os nomes dos arquivos
# selecionados:
TMP_FILE="/tmp/copytousb.tmp"



# Gravando o nome dos arquivos selecionados no arquivo temporário:
echo "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" > "$TMP_FILE"


# Testando para ver se o diretório de destino existe. Se não existir, dá ao
# usuário a opção de escolher o caminho correto.
if test -d "$DIR"
then
    echo "O dispositivo de destino existe"
else
    # Diálogo que pergunta ao usuário se ele quer escolher manualmente o ponto
    # de montagem do dispositivo. Retorna a variável $ESCOLHER com "ok" ou
    # "cancel", dependendo do que o usuário escolher.
    ESCOLHER=$(zenity --question --title="Copy to usb" --text="O dispositivo de \
destino não foi encontrado.\nDeseja procurar o ponto de montagem manualmente?" \
    && echo "ok" \
    || echo "cancel")
    
    # Se o usuário quiser escolher o ponto de montagem, mostra um diálogo para
    # isso, caso contrário, termina o programa com status 1.
    if test $ESCOLHER = ok
    then
        DIR=$(zenity --file-selection --title="Copy to usb - escolha o ponto de \
montagem" \
        --directory --filename="/media/")
    else
        exit 1
    fi
fi


# Lendo cada linha do arquivo temporário, atribuindo o valor lido à variável
# arquivo_atual, e copiando esse arquivo para a pasta de destino.
# Em caso de erro, um diálogo mostra os arquivos que não foram copiados
COUNT_FILES=0
while read LINHA; do
    [ "$LINHA" ] || continue # ignora linhas vazias
    arquivo_atual="$LINHA"
    if test -f "$arquivo_atual" # se for um arquivo...
    then
        echo "# Copiando $arquivo_atual"
        cp "$arquivo_atual" "$DIR" && COUNT_FILES=$(($COUNT_FILES+1)) || zenity --error \
        --text="Não foi possível copiar o arquivo $arquivo_atual."
        echo $COUNT_FILES
    elif test -d "$arquivo_atual" # se for um diretório...
    then
        echo "# Copiando $arquivo_atual"
        cp -r "$arquivo_atual" "$DIR" && COUNT_FILES=$(($COUNT_FILES+1)) || zenity --error \
        --text="Não foi possível copiar o diretório $arquivo_atual."
        echo $COUNT_FILES
    fi
    
    # Mostra a mensagem final.
    if [ $COUNT_FILES -gt 1 ]
    then
        echo "# $COUNT_FILES arquivos copiados para $DIR"
    elif [ $COUNT_FILES -eq 1 ]
    then
        echo "# $COUNT_FILES arquivo copiado para $DIR"
    elif [ $COUNT_FILES -eq 0 ]
    then
        echo "# Nenhum arquivo copiado para $DIR"
    fi

done < "$TMP_FILE" | zenity --progress --auto-kill --title "Copy to usb" --pulsate


# Removendo o arquivo temporário
rm "$TMP_FILE"
